// 不可复制的类型
struct Empty;
struct Null;

// `T`的泛型trait
trait DoubleDrop<T> {
//     定义一个调用者的方法,接受一个额外的参数`T`，但不对它做任何事情
    fn double_drop(self, _: T);
}
// 对泛型的调用者类型`U`和任何泛型类型`T`实现`DoubleDrop<T>`.
impl<T, U> DoubleDrop<T> for U {
    // 此方法获得两个传入参数的所有权，并将它们丢弃。
    fn double_drop(self, _: T) {
        println!("dropping twice");
    }
}
fn main() {
    let empty = Empty;
    let null = Null;
//     释放`empty` 和`null`
    empty.double_drop(null);
//     调用`double_drop`方法，将`empty`和`null`作为参数传入。
//     由于`empty`和`null`都没有实现`Drop` trait，所以它们不会被释放。
//     empty;
//     null;
}
